var Utils = require('geoUtils');

var TextUtils = {
    /**
     * 从类似url的query string格式的信息中提取指定名称参数的值
     * 注意：&后如果有空格，空格也算在参数名里
     * @param {*} url 
     * @param {*} name 
     * @return {string} 返回参数的值
     */
    getQueryString(url, name) {
        // // 以？分割url
        // var code = url.split('?');
        // // 获取最后？后面的字符串
        // code = code[code.length - 1];
        // // 分析
        // var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        // var r = code.match(reg);
        // if (r != null) return unescape(r[2]); return null;
        return TextUtils.parseQueryString(url)[name];
    },
    /**
     * 从url中解析出结果，例如解析
     * 'nodename?a=1&b=2&c=hello kitty&d=&e'
     * 为
     * {
     *  a:'1',
     *  b:'2',
     *  c:'hello kitty'
     *  d:'',
     *  e:null
     * }
     * @param {*} url 
     * @returns 返回解析的结果（键值对儿对象）
     */
    parseQueryString(url) {
        //
        var t = url.split('?');
        var kvs = t[t.length - 1];
        //
        return TextUtils.decodeKeyValueString(kvs);
    },
    /**
     * 向url中添加名为name，值为value的信息，若存在，则覆盖原有信息。
     * @param {*} url 当前url
     * @param {Object} attrs 要添加或设置的键值对象。如：
     * var url = 'demo?a=3&b=asdf';
     * var attrs = {
     *  a:12,
     *  b:'3',
     *  c:'slfd',
     *  d:'',
     *  e:null
     * };
     * 执行
     * url = setQueryString(url, attrs);
     * 后，url的值为：
     * ‘demo?a=12&b=3&c=slfd&d=&e’
     * @param {Boolean} clear true，清除之前所有的键值，仅使用传入的键值。
     * @returns 返回带有新信息的url。
     */
    setQueryString(url, attrs, clear) {
        // 分割开头与键值部分
        var t = url.split('?');
        // 缓存开头
        var prefix = t[0];
        // 处理键值
        var kvs = t[t.length - 1];
        // 获取旧键值对对象
        var attrsOld = (clear !== true) ? TextUtils.decodeKeyValueString(kvs) : {};
        // 合并新旧键值对
        attrs = Utils.obj.copyAttrs(attrs, attrsOld);
        // 编码成字符串形式
        return prefix + '?' + TextUtils.encodeKeyValueObject(attrs);
    },
    /**
     * 对形如'a=1&b=hel ss&c=&d'的键值对字符串进行解析。
     * @param {*} kvs 键值对字符串。
     * @param {*} kvCallback 传入的处理解析的方法对象。原型为：
     * function(key, value){}
     * @returns 返回解析好的对象形式键值对。
     */
    decodeKeyValueString(kvs, kvCallback) {
        //
        var ret = {};
        //
        kvs = kvs.split('&');
        // 根据=分解键与值
        kvs.forEach(kv => {
            let k, v;
            if (kv.indexOf('=') < 0) {
                // 没有=存在，kv整体作为键存在
                k = kv;
                v = null;
            } else {
                // 有=
                var t = kv.split('=');
                k = t[0];
                v = t[1] || '';
            }
            //
            ret[k] = v;
            // 调用传入的处理方法
            kvCallback && kvCallback(k, v);
        });
        //
        return ret;
    },
    /**
     * 将对象形式的键值对转换成字符串形式。
     * @param {*} kvs 
     */
    encodeKeyValueObject(kvs) {
        var t = [];
        for (var k in kvs) {
            var v = kvs[k];
            if (v == null)
                t.push(k);
            else
                t.push(k + '=' + v);
        }
        return t.join('&');
    },
};

module.exports = TextUtils;